package com.sun.designpatternsdemo.interpreter

import android.os.Bundle
import android.util.Log
import com.sun.designpatternsdemo.R
import com.sun.designpatternsdemo.app.AppConstant
import com.sun.designpatternsdemo.app.EMTagHandler
import com.sun.designpatternsdemo.base.BaseActivity
import com.sun.designpatternsdemo.databinding.ActivityInterpreterBinding
/**
 * 版权：xx公司 版权所有
 * @author sun
 * 版本：1.0
 * 创建日期：${DATE} ${TIME}
 * 描述：${DATA}
 * * 解释器模式（Interpreter Pattern）提供了评估语言的语法或表达式的方式，它属于行为型模式。
 * 这种模式实现了一个表达式接口，该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。
 * <p>
 * 主要解决：对于一些固定文法构建一个解释句子的解释器。
 */

class InterpreterActivity : BaseActivity<ActivityInterpreterBinding>() {

    override fun layoutId(): Int =R.layout.activity_interpreter

    override fun initView(savedInstanceState: Bundle?) {
        title = "解释器模式"
        mDataBind.apply {
            tvDefine.text = EMTagHandler.fromHtml(AppConstant.INTERPRETER_DEFINE)
            btMan.setOnClickListener {
                val maleExpression = getMaleExpression()
                // jingbin is male: true
                Log.e("---", "jingbin is male: " + maleExpression.interpreter("盖伦"))
            }
            btMarriedWoman.setOnClickListener {
                val womanExpression = getMarriedWomanExpression()
                // Julie is married woman: true
                Log.e(
                    "---",
                    "Julie is married woman: " + womanExpression.interpreter("亚索 永恩")
                )
            }
        }
    }
    /**
     * 规则：jingbin 和 youlookwhat 是男性
     */
    private fun getMaleExpression(): Expression {
        val jingbin = TerminalExpression("盖伦")
        val youlookwhat = TerminalExpression("赵信")
        return OrExpression(jingbin,youlookwhat)
    }

    private fun getMarriedWomanExpression():Expression{
        val julie = TerminalExpression("亚索")
        val married = TerminalExpression("永恩")
        return AndExpression(julie,married)
    }
}